import { reactive } from 'vue'

import type { UrlInfo } from '/@/components/XUII/type.d'
import fs from "/@/services/FileService"
import fh, { FileExtInfo } from "/@/utils/FileHelper"

type ConfigKeyValue = Record<string,any>

const fileIconConfig: ConfigKeyValue = {
    'tar': '--icon_file_tar',
    'zip': '--icon_file_zip',
    'pdf':'--icon_file_pdf',
    'epub':'--icon_file_epub',
    'xls':'--icon_file_excel',
    'xlsx':'--icon_file_excel',
    'json':'--icon_file_json',
    'svg':'--icon_file_svg',
    'bmp':'--icon_file_bmp',
    'gif':'--icon_file_gif',
    'ico':'--icon_file_ico',
    'jpg':'--icon_file_jpg',
    'tga':'--icon_file_tga',
    'tiff':'--icon_file_tiff',
    'html':'--icon_file_html',
    'sql':'--icon_file_sql',
    'js':'--icon_file_js',
    'py':'--icon_file_py',
    'css':'--icon_file_css',    
    'less':'--icon_file_less',
    'md':'--icon_file_md',
    'rtf':'--icon_file_rtf',
    'rust':'--icon_file_rust',
    'wiki':'--icon_file_wiki',
    'cpp':'--icon_file_cpp',        
    'cs':'--icon_file_csharp',
    'go':'--icon_file_go',
    'hs':'--icon_file_haskell',
    'java':'--icon_file_java',
    'ktl':'--icon_file_kotlin',
    'lua':'--icon_file_lua',
    'pl':'--icon_file_pascal',
    'php':'--icon_file_php',
    'qml':'--icon_file_qml',
    'r':'--icon_file_r',     
    'rb':'--icon_file_ruby',
    'sass':'--icon_file_sass',
    'scss':'--icon_file_sass',
    'scala':'--icon_file_scala',
    'tcl':'--icon_file_tcl',
    'ts':'--icon_file_typescript',
    'xml':'--icon_file_xml',
    'c':'--icon_file_c',
    'h':'--icon_file_h'        
}

export const icon_dir_default = '--icon_dir_default'
const icon_file_default = '--icon_file_default'
export const get_icon_file = (ext: string) => {
    if (ext in fileIconConfig) {
       return fileIconConfig[ext]
    }
    return icon_file_default
}
/**
 * 文件视图数据类型定义
 */
export interface FileViewData {
    /**
     * 文件视图当前目录
     */
    cur_path:string
    /**
     * 视图类型
     * icon 图标
     * list 列表
     */
    view_type: "icon" | "list"
    /**
     * 面包屑
     */
    breadcrumb_urls: Array<UrlInfo>
    /**
     * 当前文件目录数
     */
    total_count: number
    /**
     * 文件目录列表数据
     */
    data: Array<FileExtInfo>
}
/**
 * 文件视图
 */
export class FileView {    
    /**
     * 视图数据
     */
    viewData = reactive<FileViewData>({
        cur_path:'',
        view_type: 'list',
        breadcrumb_urls: [],
        total_count: 0,
        data: []
    })
    
    constructor () {
        
    }
    /**
     * 更改当前目录
     * @param path 目录
     */
    async change_cur_path(path: string) {
        this.viewData.cur_path = path
        await this.get_data()
    }
    async refresh () {
        await this.get_data()
    }   
    /**
     * 获取面包屑和文件列表数据
     */
    private async get_data () {
        let dir = this.viewData.cur_path
        let fileData = await fs.get_files(dir)
        let { dirPaths, fileList } = fileData
        let bcUrls = [{ url: "/home", title: "根目录" }]
        if (dirPaths) {
            for (let i in dirPaths) {
                let item = dirPaths[i]
                bcUrls.push({ url: "/home?dir=" + item.path, title: item.name })
            }
        }
        this.viewData.breadcrumb_urls = bcUrls
        if (fileList) {
            this.viewData.total_count = fileList.length
            this.viewData.data = fileList.map((x) => fh.getInfo(x))
        }       
    }
}